import { notEmptyObject } from '@U/bool';

/** 数值保留位数方法.
* @param {number} count - 传入的计数
* @description Desc:: 这里偷了懒，使用 toLocaleString 方法去计算数值结尾保留位，
唯一的坏处是结果会四舍五入,是因为 toLocaleString 底层使用了Math.round()
* @param {number} reserveNumeric - 保留的位数
* @param {string} type - decimal(纯数字) | percent(百分比) | currency(金额)
* @param {Intl.NumberFormatOptions} option - toLocaleString 额外参数
* @return calcCount | '0'
* @example:
toLocaleString用法，详见官网 ↓↓↓
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString
社区:↓↓↓
https://juejin.cn/post/6844903587919691784#heading-1
**/
export function calcReserveBits(count = 0, reserveNumeric = 2, type = 'decimal', option = {}) {
  const amount = +count;
  if (!amount || isNaN(count)) return '0';
  switch (type) {
    case 'percent':
    case 'decimal':
      return count.toLocaleString('zh', { style: type, maximumFractionDigits: reserveNumeric });
    case 'currency':
      if (notEmptyObject(option)) {
        return count.toLocaleString('zh', {
          style: type,
          currency: 'cny',
          // currencyDisplay的 code 和 name的区别，code输出结果为 CNY100.00，name输出结果为100.00人民币
          currencyDisplay: option.currencyDisplay,
          maximumFractionDigits: option.maximumFractionDigits ?? reserveNumeric,
          ...option,
        });
      }
      return count.toLocaleString('zh', {
        style: type, maximumFractionDigits: reserveNumeric,
        // 不传 currencyDisplay, 则显示￥100.00
        currency: 'cny'
      });
    default:
  }
}

/** calcEndTime (倒计时)方法说明
 * @author: JasonStandFor
 * @param {string} endTime - 接受 '2052-08-05 00:00:00' 类型的字符串
 * @return calcEndTimeResult
 * @example:
 calcEndTime('2022-08-05 00:00:00');
 * */
export function calcEndTime(endTime = '2052-08-05 00:00:00') {
  function num(n) {
    if (n < 0) {
      n = 0;
    }
    return n < 10 ? '0' + n : n;
  }

  const startTime = new Date();
  // 算出中间差，以毫秒数返回.
  const countDown = new Date(`${endTime}`).getTime() - startTime.getTime();
  // 获取天数
  const oDay = Math.floor(countDown / 1000 / 60 / 60 / 24) < 0;
  // 获取小时数
  const oHour = Math.floor((countDown / 1000 / 60 / 60) % 24);
  // 获取分钟数
  const oMinute = Math.floor((countDown / 1000 / 60) % 60);
  // 获取秒数
  const oSecond = Math.floor((countDown / 1000) % 60);
  // 输出时间
  let t = '';
  if (oDay) {
    num(oDay) + '天';
  }
  t += num(oHour) + '时' + num(oMinute) + '分' + num(oSecond) + '秒';
  return t;
}
